package com.butang.code.binaryTree.leetCode1379;


import java.util.ArrayDeque;
import java.util.Queue;

/**
 * ClassName: LeetCode1379
 * Package: com.butang.code.binaryTree
 * Description: 1379. 找出克隆二叉树中的相同节点
 *  https://leetcode.cn/problems/find-a-corresponding-node-of-a-binary-tree-in-a-clone-of-that-tree/description/
 *
 *给你两棵二叉树，原始树 original 和克隆树 cloned，以及一个位于原始树 original 中的目标节点 target。
 * 其中，克隆树 cloned 是原始树 original 的一个 副本 。
 * 请找出在树 cloned 中，与 target 相同 的节点，并返回对该节点的引用（在 C/C++ 等有指针的语言中返回 节点指针，其他语言返回节点本身）。
 * 注意：你 不能 对两棵二叉树，以及 target 节点进行更改。只能 返回对克隆树 cloned 中已有的节点的引用。
 *
 * 输入: tree = [7,4,3,null,null,6,19], target = 3
 * 输出: 3
 * 解释: 上图画出了树 original 和 cloned。target 节点在树 original 中，用绿色标记。答案是树 cloned 中的黄颜色的节点（其他示例类似）。
 *
 *
 * 示例 1:
 *
 * @Author BuTang
 * @Create 2024/4/3 9:40
 * @Version 1.0
 */
public class LeetCode1379 {


    // 方法一：深度优先查找
    public final TreeNode getTargetCopy1(final TreeNode original, final TreeNode cloned, final TreeNode target) {
        if (original ==null) {
            return null;
        }
        // 因为是cloned是复制的original所以可以直接返回
        if (original == target) {
            return cloned;
        }
        TreeNode targetCopy = getTargetCopy1(original.left, cloned.left, target);
        if (targetCopy !=null ){
            return targetCopy;
        }
        // 当左侧递归查找不到时，递归右边查找
        return getTargetCopy1(original.right,cloned.right,target);
    }

    //方法二：广度优先搜索
    public final TreeNode getTargetCopy2(final TreeNode original, final TreeNode cloned, final TreeNode target) {
        Queue<TreeNode> q1 = new ArrayDeque<>(),q2 = new ArrayDeque<>();
        q1.offer(original);
        q2.offer(original);
        while (q1.size() > 0) {
            TreeNode node1 = q1.poll(), node2 = q2.poll();
            if (node1 == target) {
                return node2;
            }
            if (node1.left != null) {
                q1.offer(node1.left);
                q2.offer(node2.left);
            }
            if (node1.right != null) {
                q1.offer(node1.right);
                q2.offer(node2.right);
            }
        }
        return null;
    }


    }
